﻿Public Class frmPacMan

#Region "VARIABLES"
    Dim MiTablero As New CTablero
    Dim Boton_Tablero As Button
    Private Movimientos As New List(Of String)
    Dim Tablero As New List(Of Integer)
    Dim Fantasmitos As Integer = 5
    Dim miJugador As New CJugadorPacman
    Dim PuntuacionTotal As Integer = 0
    Dim PuntosBonusLogro As Integer = 0
    Dim vidas As Integer = 3
#End Region
#Region "Subprograma Logros"
    Public Sub Logros()
        If miJugador.Logro500(lblPuntos.Text) = True Then
            lbl500.ForeColor = Color.Red
            PuntosBonusLogro = PuntosBonusLogro + 500
        End If
        If miJugador.Logro1000(lblPuntos.Text) = True Then
            lbl1000.ForeColor = Color.Red
            PuntosBonusLogro = PuntosBonusLogro + 1000
        End If
        If miJugador.Logro3000(lblPuntos.Text) = True Then
            lbl3000.ForeColor = Color.Red
            PuntosBonusLogro = PuntosBonusLogro + 3000
        End If
        If miJugador.Logro10000(lblPuntos.Text) = True Then
            lbl10000.ForeColor = Color.Red
            PuntosBonusLogro = PuntosBonusLogro + 10000
        End If
        If miJugador.LogroTitulo(lblPuntos.Text) = True Then
            lblTodosLogros.ForeColor = Color.Red
            PuntosBonusLogro = PuntosBonusLogro + 5000
        End If
    End Sub
#End Region
#Region "Subprograma SumarPuntuacion"
    Public Sub SumarPuntuacion()
        lblPuntos.Text = lblPuntos.Text + 5
    End Sub
#End Region
#Region "Subprograma ResetearNuevaVida"
    Public Sub Resetear_NUEVA_Vida()
        For i = 0 To GBMapa.Controls.Count - 1
            GBMapa.Controls(i).Enabled = False
            Cronometro.Enabled = False
            lblTiempo.Text = 120
            miJugador.Tiempo = lblTiempo.Text
            btnGenerarMapa.Enabled = True
            btnComenzar.Enabled = False
        Next
    End Sub
#End Region
#Region "MOVER PACMAN"
    Private Sub frmPacMan_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown

        'Movimiento PacMan -------------------------------------------------------------------------------------------

        Dim Posicion As Integer = 0
        'Guardamos la posición del PacMan, es decir, del cuadrado que esté de color naranja --------------------------
        For i = 0 To GBMapa.Controls.Count - 1
            If GBMapa.Controls(i).BackColor = Color.Orange Then
                Posicion = i
            End If
        Next


        'Comienza Select Case dependiendo de si presionamos derecha, izquierda, arriba o abajo -----------------------
        Select Case e.KeyCode

            Case Keys.A
                'Lo que preguntamos en cada if es sencillo:
                'Si el color del de la posición es naranja y la posicion del movimiento final es transparente o morado podra moverse al lugar
                If MiTablero.Izquierda(GBMapa.Controls(Posicion).BackColor = Color.Orange AndAlso GBMapa.Controls(Posicion - 1).BackColor = Color.Transparent Or GBMapa.Controls(Posicion - 1).BackColor = Color.Thistle Or GBMapa.Controls(Posicion - 1).BackColor = Color.Red) Then
                    If GBMapa.Controls(Posicion - 1).BackColor = Color.Red Then
                        Reloj.Enabled = False
                        MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        vidas = vidas - 1
                        lblVidas.Text = "X" & vidas
                        Cronometro.Enabled = False
                        Resetear_NUEVA_Vida()
                    End If
                    If GBMapa.Controls(Posicion - 1).BackColor = Color.Thistle Then
                        SumarPuntuacion()
                        Logros()
                    End If
                    GBMapa.Controls(Posicion).BackColor = Color.Transparent
                    GBMapa.Controls(Posicion - 1).BackColor = Color.Orange
                End If

            Case Keys.D
                If MiTablero.Derecha(GBMapa.Controls(Posicion).BackColor = Color.Orange AndAlso GBMapa.Controls(Posicion + 1).BackColor = Color.Transparent Or GBMapa.Controls(Posicion + 1).BackColor = Color.Thistle Or GBMapa.Controls(Posicion + 1).BackColor = Color.Red) Then
                    If GBMapa.Controls(Posicion + 1).BackColor = Color.Red Then
                        Reloj.Enabled = False
                        MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        vidas = vidas - 1
                        lblVidas.Text = "X" & vidas
                        Cronometro.Enabled = False
                        Resetear_NUEVA_Vida()
                    End If
                    If GBMapa.Controls(Posicion + 1).BackColor = Color.Thistle Then
                        SumarPuntuacion()
                        Logros()
                    End If
                    GBMapa.Controls(Posicion).BackColor = Color.Transparent
                    GBMapa.Controls(Posicion + 1).BackColor = Color.Orange
                End If

            Case Keys.S
                If Posicion > 181 Then Exit Sub
                If MiTablero.Abajo(GBMapa.Controls(Posicion).BackColor = Color.Orange AndAlso GBMapa.Controls(Posicion + 14).BackColor = Color.Transparent Or GBMapa.Controls(Posicion + 14).BackColor = Color.Thistle, Posicion Or GBMapa.Controls(Posicion + 14).BackColor = Color.Red) Then

                    If GBMapa.Controls(Posicion + 14).BackColor = Color.Red Then
                        Reloj.Enabled = False
                        MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        vidas = vidas - 1
                        lblVidas.Text = "X" & vidas
                        Cronometro.Enabled = False
                        Resetear_NUEVA_Vida()
                    End If
                    If GBMapa.Controls(Posicion + 14).BackColor = Color.Thistle Then
                        SumarPuntuacion()
                        Logros()
                    End If
                    GBMapa.Controls(Posicion).BackColor = Color.Transparent
                    GBMapa.Controls(Posicion + 14).BackColor = Color.Orange
                End If

            Case Keys.W
                If Posicion < 15 Then Exit Sub
                If MiTablero.Arriba(GBMapa.Controls(Posicion).BackColor = Color.Orange AndAlso GBMapa.Controls(Posicion - 14).BackColor = Color.Transparent Or GBMapa.Controls(Posicion - 14).BackColor = Color.Thistle, Posicion Or GBMapa.Controls(Posicion - 14).BackColor = Color.Red) Then
                    If GBMapa.Controls(Posicion - 14).BackColor = Color.Red Then
                        Reloj.Enabled = False
                        MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        Cronometro.Enabled = False
                        vidas = vidas - 1
                        lblVidas.Text = "X" & vidas
                        Resetear_NUEVA_Vida()
                    End If

                    If GBMapa.Controls(Posicion - 14).BackColor = Color.Thistle Then
                        SumarPuntuacion()
                        Logros()
                    End If
                    GBMapa.Controls(Posicion).BackColor = Color.Transparent
                    GBMapa.Controls(Posicion - 14).BackColor = Color.Orange
                End If

        End Select
    End Sub
#End Region
#Region "Creation Map"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Declaration of variables
        Static PosicionX As Integer = 0
        Static posicionY As Integer = 0
        Static CambioLinea As Integer = 0
        Static tags As Integer = 0

        GBMapa.Focus()
        lblVidas.Text = "X " & vidas
        'Creation of map
        For i = 0 To 195
            Boton_Tablero = New Button
            Boton_Tablero.AutoSize = True
            Boton_Tablero.Text = ""
            Boton_Tablero.Name = "BotonTablero"
            Boton_Tablero.Visible = True
            Boton_Tablero.Location = New Point(20 + PosicionX, 25 + posicionY)
            Boton_Tablero.Height = 15
            Boton_Tablero.Width = 15
            Boton_Tablero.Tag = Boton_Tablero.Tag + tags
            tags = tags + 1
            Boton_Tablero.Enabled = False
            GBMapa.Controls.Add(Boton_Tablero)
            PosicionX = PosicionX + 15
            CambioLinea = CambioLinea + 1
            'ControlLine
            If CambioLinea = 14 Then
                posicionY = posicionY + 15
                PosicionX = 0
                CambioLinea = 0
            End If
        Next
    End Sub
#End Region
#Region "BTN_GENERATE_MAP"
    Private Sub btnGenerarMapa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGenerarMapa.Click
        'Declaration of variables
        Dim PosicionInicial As Integer = 0
        Dim Numero As New Random
        'Initialization map
        If vidas = 0 Then
            MessageBox.Show("El juego se va a cerrar, tu puntuación quedará guardada!", "Derrota Infinita", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            PuntuacionTotal = lblPuntos.Text
            MiJuego.UsuarioActual.SumarPuntos(3, PuntuacionTotal + PuntosBonusLogro)
            Me.Close()
            Exit Sub
        End If
        Tablero.Clear()
        btnComenzar.Enabled = True
        Tablero = MiTablero.GenerarMapaAleatorio
        For a = 0 To GBMapa.Controls.Count - 1
            GBMapa.Controls(a).BackColor = Color.Transparent
        Next
        'Drawing board 
        For x As Integer = 0 To 195
            If Tablero(x) = 1 Then GBMapa.Controls(x).BackColor = Color.Black
            If Tablero(x) = 2 Then GBMapa.Controls(x).BackColor = Color.Red
        Next
        'Control Exception
        GBMapa.Controls(195).BackColor = Color.Black
        GBMapa.Controls(0).BackColor = Color.Black
        PosicionInicial = Numero.Next(0, 195)
        'Creation PacManColorX
        If GBMapa.Controls(PosicionInicial).BackColor <> Color.Red Or GBMapa.Controls(PosicionInicial).BackColor <> Color.Black Then GBMapa.Controls(PosicionInicial).BackColor = Color.Orange
        'Creation Points
        For i = 0 To GBMapa.Controls.Count - 1
            If GBMapa.Controls(i).BackColor = Color.Transparent Then GBMapa.Controls(i).BackColor = Color.Thistle
        Next
    End Sub
#End Region
#Region "BTN_START"
    Private Sub btnComenzar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnComenzar.Click
        'BTN_COMENZAR
        Reloj.Enabled = True
        Cronometro.Enabled = True
        btnGenerarMapa.Enabled = False
        btnComenzar.Enabled = False
    End Sub
#End Region
#Region "TIME"

    Private Sub Reloj_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Reloj.Tick
        'Declaration of variables
        Dim Numero As New Random
        Dim Sentido As Integer = 0
        Dim i As Integer = 0
        'Movement of Ghosts (Switch Case Random)
        'For each test a random position Ghost

        Do
            i = Numero.Next(195)
        Loop Until GBMapa.Controls(i).BackColor = Color.Red
        'Elijo Sentido en el que se movera el fantasma
        Sentido = Numero.Next(0, 4)
        Select Case Sentido
            '0=Right
            '1=Left
            '2=Below
            '3=Up

            Case 0
                If GBMapa.Controls(i).BackColor = Color.Red AndAlso Not GBMapa.Controls(i + 1).BackColor = Color.Black AndAlso Not GBMapa.Controls(i + 1).BackColor = Color.Red Then
                    If GBMapa.Controls(i + 1).BackColor = Color.Orange Then
                        Reloj.Enabled = False
                        MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        Cronometro.Enabled = False
                        vidas = vidas - 1
                        lblVidas.Text = "X" & vidas
                        
                        Resetear_NUEVA_Vida()
                    End If
                    If GBMapa.Controls(i + 1).BackColor = Color.Transparent Then
                        lblPuntos.Text = lblPuntos.Text - 2
                    End If
                    GBMapa.Controls(i).BackColor = Color.Thistle
                    GBMapa.Controls(i + 1).BackColor = Color.Red
                End If

            Case 1
                If GBMapa.Controls(i).BackColor = Color.Red AndAlso Not GBMapa.Controls(i - 1).BackColor = Color.Black AndAlso Not GBMapa.Controls(i - 1).BackColor = Color.Red Then
                    If GBMapa.Controls(i - 1).BackColor = Color.Orange Then
                        Reloj.Enabled = False
                        MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                        Cronometro.Enabled = False
                        
                        vidas = vidas - 1
                        lblVidas.Text = "X" & vidas
                        
                        Resetear_NUEVA_Vida()
                    End If
                    If GBMapa.Controls(i - 1).BackColor = Color.Transparent Then
                        lblPuntos.Text = lblPuntos.Text - 2
                    End If
                    GBMapa.Controls(i).BackColor = Color.Thistle
                    GBMapa.Controls(i - 1).BackColor = Color.Red
                End If

            Case 2
                'Control lastLine
                If i < 182 Then
                    If GBMapa.Controls(i).BackColor = Color.Red AndAlso Not GBMapa.Controls(i + 14).BackColor = Color.Black AndAlso Not GBMapa.Controls(i + 14).BackColor = Color.Red Then
                        If GBMapa.Controls(i + 14).BackColor = Color.Orange Then
                            Reloj.Enabled = False
                            MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                            Cronometro.Enabled = False
                            
                            vidas = vidas - 1
                            lblVidas.Text = "X" & vidas
                           
                            Resetear_NUEVA_Vida()
                        End If
                        If GBMapa.Controls(i + 14).BackColor = Color.Transparent Then
                            lblPuntos.Text = lblPuntos.Text - 2
                        End If
                        GBMapa.Controls(i).BackColor = Color.Thistle
                        GBMapa.Controls(i + 14).BackColor = Color.Red
                    End If
                End If

            Case 3
                If i > 14 Then
                    'Control firstLine
                    If GBMapa.Controls(i).BackColor = Color.Red AndAlso Not GBMapa.Controls(i - 14).BackColor = Color.Black AndAlso Not GBMapa.Controls(i - 14).BackColor = Color.Red Then
                        If GBMapa.Controls(i - 14).BackColor = Color.Orange Then
                            Reloj.Enabled = False
                            MessageBox.Show("Has perdido!", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
                            Cronometro.Enabled = False
                            
                            vidas = vidas - 1
                            lblVidas.Text = "X" & vidas
                            Resetear_NUEVA_Vida()
                        End If
                        If GBMapa.Controls(i - 14).BackColor = Color.Transparent Then
                            lblPuntos.Text = lblPuntos.Text - 2
                        End If
                        GBMapa.Controls(i).BackColor = Color.Thistle
                        GBMapa.Controls(i - 14).BackColor = Color.Red
                    End If
                End If
        End Select
    End Sub

#End Region
#Region "CRONOMETRO"
    Private Sub Cronometro_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cronometro.Tick
        lblTiempo.Text = lblTiempo.Text - 1
        If lblTiempo.Text = 0 Then
            Reloj.Enabled = False
            MessageBox.Show("Se acabo el tiempo, tu puntuación será guardada", "Derrota", MessageBoxButtons.OK, MessageBoxIcon.Information)
            PuntuacionTotal = lblPuntos.Text
            MiJuego.UsuarioActual.SumarPuntos(3, PuntuacionTotal + PuntosBonusLogro)
            Cronometro.Enabled = False
        End If
    End Sub
#End Region

  
End Class
